# -*- coding: utf-8 -*-
# @File  : thread_lock.py
# @Author: zbh
# @Date  : 2025/2/27_15:39

'''
通过threading.Lock()创建锁对象，然后在需要同步的代码块中使用acquire()和release()方法来获取和释放锁。
acquire()方法会阻塞当前线程，直到获取到锁为止。release()方法会释放锁。
互斥锁，在同一时刻，只有一个线程可以获取到锁，其他线程需要等待锁被释放后才能获取到锁。
也就是说同一时刻只允许一个线程访问共享数据；
'''
import threading
import random

num = 0 # 全局变量, 多个线程共享, 线程不安全，各个线程之间可以访问同一内存块，即可访问同一全局变量

def task_thread(lock):
    global num # 声明全局变量
    lock.acquire() # 获取锁
    print(f"线程：{threading.currentThread().name},已经获取锁")
    for i in range(10):
        n = random.randint(1,99)
        num = num + n
    print(f"线程：{threading.currentThread().name},的num的值是：{num}")
    print(f"线程：{threading.currentThread().name},已经释放锁")
    lock.release() # 释放锁, 释放锁后，其他线程才能获取到锁

def main():
    lock = threading.Lock() # 创建锁对象
    thread_list = []
    for i in range(10):
        t = threading.Thread(target=task_thread,args=(lock,)) # 创建线程对象, target是函数名，args是函数的参数
        thread_list.append(t) # 将线程对象添加到列表中
        t.start() # 启动线程, 线程的入口
    for t in thread_list:
        t.join() # 等待线程结束,确保主线程会等待所有子线程执行完毕后再继续执行后续代码
    print(f"主线程结束，num的值是：{num}")

if __name__ =="__main__":  # 程序入口
    main()







